﻿using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.Xml;
using Microsoft.VisualBasic.PowerPacks;

namespace SalaryKOG
{
    public partial class Salary_KOG : Form
    {
        #region du lieu public dung de truyen vao luc goi FORM
        public int thang, nam;
        #endregion

        #region du lieu dung de ve
        int X_GOC = 40, Y_GOC = 140, WITH_THU = 160, HEIGHT_THU = 40;
        int WITH_CHECK2 = 100;
        Label[] lblThu = new Label[7];
        LineShape[] lineShapes = new LineShape[6];
        ShapeContainer shapeContainer1;
        CheckBox[,] check1 = new CheckBox[6, 7];
        TextBox[,] txtOver = new TextBox[6, 7];
        string name_check1, name_text;
        string[] slblThu = { "CHỦ NHẬT", "THỨ 2", "THỨ 3", "THỨ 4", "THỨ 5", "THỨ 6", "THỨ 7" };
        #endregion

        
        XmlDocument Doc = new XmlDocument();
        private int TongSoNgayLam, TongSoGioThem;
        private int LuongCB;    // Lương cơ bản trên 1 tháng    (VD: 3 triệu)
        private int DayOfMonth; // Số ngày phải làm của 1 tháng (VD: 24 ngày)
        private int HourOfDay;  // Số giờ  phải làm của 1 ngày  (VD:  8 giờ )
        private int MoneyOfHour;// Số tiền công trên 1 giờ = Lương CB / Số ngày phải làm trên 1 tháng / số giờ phải làm trên 1 ngày
        private int thu;// thu : Lưu thứ của ngày đầu tiên trong tháng  0: CN, 1: Thứ 2 ..vv 6: Thứ 7
        private int numday; //numday : Lưu số ngày của tháng đang xét (VD: tháng 12 có 31 ngày)
        
        public Salary_KOG()
        {
            InitializeComponent();
            // Load file config
            string filename = Application.StartupPath + "\\Config.xml";
            DataTable dataTable = new DataTable();
            dataTable = XMLManager.ReadToXML(filename);

            LuongCB = int.Parse(dataTable.Rows[0]["LuongCB"].ToString());
            HourOfDay = int.Parse(dataTable.Rows[0]["HourOfDay"].ToString());
            DayOfMonth = int.Parse(dataTable.Rows[0]["DayOfMonth"].ToString());

            lblName.Text = dataTable.Rows[0]["Name"].ToString();
            MoneyOfHour = LuongCB/(DayOfMonth*HourOfDay);

        }
        private void Salary_KOG_Load(object sender, EventArgs e)
        {
            
            if (thang == 0) thang = DateTime.Now.Month;
            if (nam == 0) nam = DateTime.Now.Year;
            string date = "01/"+thang+"/" + nam;
            DateTime dateTime = Convert.ToDateTime(date);
            thu = ProcessDay.GetThu(dateTime); // xac dinh ngay mùng 1 của tháng là vào thứ mấy để phục vụ cho việc vẽ
            
            lblMonth.Text = thang.ToString();
            lblYear.Text = nam.ToString();

            numday = DateTime.DaysInMonth(nam, thang); // xác định số ngày của tháng
            ItemDay[] itemDays = LoadData(thang, nam, numday);
            DrawGrid(itemDays,thu,numday);

            // Load Luong CB va Luong TG theo thang/nam
            string filename = Application.StartupPath + "\\Salary.xml";
            DataTable dataTable = new DataTable();
            dataTable = XMLManager.ReadToXML(filename);

            // Tim trong bảng Salary các thông số lưu lương - Nếu có thì load lên, nếu không có thì tạo các giá trị mặc định
            // <date> thang/năm  <LuongCB> 0  <LuongTG>  0
            bool kt = false;
            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
                if (dataTable.Rows[i]["date"].ToString() == thang + "/" + nam)
                {
                    txtLuongCB.Text = dataTable.Rows[i]["LuongCB"].ToString();
                    txtLuongTG.Text = dataTable.Rows[i]["LuongTG"].ToString();
                    kt = true;
                }
            }

            if (!kt)
            {
                // Nếu chưa có thông số về lương thì thiết lập mặc định
                Doc.Load(filename);
                XmlElement Month, dates, LuongCBs, LuongTGs;
                Month = Doc.CreateElement("Month");
                dates = Doc.CreateElement("date");
                LuongCBs = Doc.CreateElement("LuongCB");
                LuongTGs = Doc.CreateElement("LuongTG");
                dates.InnerText = thang + "/" + nam;
                LuongCBs.InnerText = "0";
                LuongTGs.InnerText = "0";

                Month.AppendChild(dates);
                Month.AppendChild(LuongCBs);
                Month.AppendChild(LuongTGs);

                Doc.DocumentElement.AppendChild(Month);
                Doc.Save(Application.StartupPath + "\\Salary.xml");
            }
            


            lblTN.Text = TongSoNgayLam.ToString();
            lblTG.Text = TongSoGioThem.ToString();
            lblNT.Text = ((float)TongSoGioThem/8).ToString();


        }
        private void DrawGrid(ItemDay[] itemDays,int start, int numday)
        {
            // Ve thu
            for (int i = 0; i < 7; i++)
            {
                lblThu[i] = new Label();
                lblThu[i].AutoSize = true;
                lblThu[i].Font = new System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
                lblThu[i].Location = new System.Drawing.Point(40+(WITH_THU*i), 100);
                lblThu[i].Size = new System.Drawing.Size(54, 18);
                //lblThu[i].TabIndex = 7;
                lblThu[i].Text = slblThu[i];
                this.Controls.Add(lblThu[i]);
            }

            int ngay;
            
            // Ve ngay trong thang
            for (int i = 0; i < 6; i++)
            {
                // Ve line shape
                lineShapes[i] = new LineShape();
                lineShapes[i].X1 = 190 + (i*WITH_THU);
                lineShapes[i].X2 = 190 + (i * WITH_THU);
                lineShapes[i].Y1 = 100;
                lineShapes[i].Y2 = 375;
                
                for (int j = 0; j < 7; j++)
                {
                    // Khoi tao check1
                    if ((i == 0 && j >= start) || i > 0)
                    {
                        ngay = ((i*7) + j + 1 - start);
                        if (ngay > numday) break;
                        check1[i, j] = new CheckBox();
                        name_check1 = "checkbBox1" + i.ToString() + j.ToString();
                        check1[i, j].AutoSize = true;
                        check1[i, j].Location = new System.Drawing.Point(X_GOC + (j*160), Y_GOC + (HEIGHT_THU*i));
                        check1[i, j].Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
                        check1[i, j].Name = name_check1;
                        check1[i, j].Size = new System.Drawing.Size(34, 20);
                        check1[i, j].Text = ngay.ToString();
                        check1[i, j].UseVisualStyleBackColor = true;
                        check1[i, j].Checked = itemDays[ngay-1].StatusDay;
                        
                        check1[i, j].CheckedChanged += new System.EventHandler(this.check1_CheckedChanged);
                        this.Controls.Add(check1[i, j]);

                        // Khoi tao check2
                        /*name_check2 = "checkbBox2" + i.ToString() + j.ToString();
                        check2[i, j] = new CheckBox();
                        check2[i, j].AutoSize = true;
                        check2[i, j].Location = new System.Drawing.Point(X_GOC + (j*160) + WITH_CHECK1,
                                                                         Y_GOC + (HEIGHT_THU*i));
                        check2[i, j].Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
                        check2[i, j].Name = name_check2;
                        check2[i, j].Size = new System.Drawing.Size(62, 20);
                        check2[i, j].Text = S_OVERT;
                        check2[i, j].UseVisualStyleBackColor = true;
                        if (check1[i, j].Checked) check2[i, j].Enabled = true;
                        else check2[i, j].Enabled = false;

                        check2[i, j].CheckedChanged += new System.EventHandler(this.check2_CheckedChanged);
                        this.Controls.Add(check2[i, j]); */

                        // Khoi tao textbox

                        txtOver[i, j] = new TextBox();
                        name_text = "textBoxOvr" + i.ToString() + j.ToString();
                        txtOver[i, j].Location = new System.Drawing.Point(X_GOC + (j*160) + WITH_CHECK2,
                                                                          Y_GOC + (HEIGHT_THU*i));
                        txtOver[i, j].Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
                        txtOver[i, j].Name = name_text;
                        txtOver[i, j].Size = new System.Drawing.Size(32, 23);
                        
                        // Neu co them gio thi check them gio, mo textbox va gan gio them vao
                        if (itemDays[ngay - 1].Hours != "")
                        {
                            //check2[i, j].Checked = true;
                            //txtOver[i, j].Enabled = true;
                            txtOver[i, j].Text = itemDays[ngay - 1].Hours;
                        }

                        txtOver[i, j].ReadOnly = true;

                        if (check1[i, j].Checked) txtOver[i, j].Enabled = true;
                        else txtOver[i, j].Enabled = false;

                        txtOver[i, j].KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtOver_KeyDown);
                        txtOver[i, j].DoubleClick += new System.EventHandler(this.txtOver_DoubleClick);
                        
                        
                        this.Controls.Add(txtOver[i, j]);
                    }//end if
                }//end for j

            }// end for i
            this.shapeContainer1 = new ShapeContainer();
            this.shapeContainer1.Location = new System.Drawing.Point(0, 0);
            this.shapeContainer1.Margin = new System.Windows.Forms.Padding(0);
            this.shapeContainer1.Name = "shapeContainer1";
            
            this.shapeContainer1.Size = new System.Drawing.Size(1147, 540);
            this.shapeContainer1.TabStop = false;
            this.shapeContainer1.Shapes.AddRange(lineShapes);
            this.Controls.Add(this.shapeContainer1);
        } // end void Draw
        public ItemDay[] LoadData(int thang, int nam, int numday)
        {
            // bien numday chua so ngay trong thang can load data
            
            string filename = Application.StartupPath + "\\Data.xml";
            DataTable dataTable = new DataTable();
            dataTable = XMLManager.ReadToXML(filename);

            // Tao mang ItemDay chua gia tri mac dinh
            ItemDay[] itemDays = new ItemDay[numday];
            for (int i = 0; i < numday; i++)
            {
                itemDays[i] = new ItemDay();
                itemDays[i].StatusDay = false;
                itemDays[i].Hours = "";
            }

            // Dien du lieu vao mang ItemDay
            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
                 string date = dataTable.Rows[i]["date"].ToString();
                 DateTime dateTime = Convert.ToDateTime(date);
                 int day = dateTime.Day;
                 int month = dateTime.Month;
                 int year = dateTime.Year;
                 if (month == thang && year == nam)
                 {
                     itemDays[day-1].StatusDay = true;
                     if (ProcessDay.GetThu(dateTime) != 0) // Khong phai la CN
                     {
                         TongSoNgayLam += 1;    
                     }
                     
                     if (dataTable.Rows[i]["text"].ToString() != "")
                     {
                         itemDays[day - 1].Hours = dataTable.Rows[i]["text"].ToString();
                         TongSoGioThem += int.Parse(dataTable.Rows[i]["text"].ToString());
                     }
                         
                 }
            }
            return itemDays;
        }

        private void check1_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox c = (CheckBox)sender;
            string selectDate = c.Text + "/" + thang.ToString() + "/" + nam.ToString();
            string name = c.Name;
            Point p = GetPoint(name);
            
            
            
                if (c.Checked)
                {
                    // Cong them tien luong vao luong neu khong la CN
                    if (ProcessDay.GetThu(Convert.ToDateTime(selectDate)) != 0)
                    {
                        txtLuongCB.Text = (int.Parse(txtLuongCB.Text) + (int)(LuongCB / DayOfMonth)).ToString();    
                    }
                    

                    //Them du lieu vao data.xml
                    Doc.Load(Application.StartupPath + "\\Data.xml");
                    XmlElement Salary, date, text;
                    Salary = Doc.CreateElement("Salary");
                    date = Doc.CreateElement("date");
                    text = Doc.CreateElement("text");
                    date.InnerText = selectDate;
                    text.InnerText = "";
                    Salary.AppendChild(date);
                    Salary.AppendChild(text);
                    Doc.DocumentElement.AppendChild(Salary);
                    Doc.Save(Application.StartupPath + "\\Data.xml");

                    // Enable txtOver
                    txtOver[p.X, p.Y].Enabled = true;

                }
                else
                {
                    // Tru tien luong vao luong neu khong la CN
                    if (ProcessDay.GetThu(Convert.ToDateTime(selectDate)) != 0)
                    {
                        txtLuongCB.Text = (int.Parse(txtLuongCB.Text) - (int)(LuongCB / DayOfMonth)).ToString();    
                    }
                    

                    //Xoa du lieu trong data
                    Doc.Load(Application.StartupPath + "\\Data.xml");
                    XmlNode node;
                    node = Doc.SelectSingleNode("/Datas/Salary[date='" + selectDate + "']");
                    if (node != null)
                    {
                        Doc.DocumentElement.RemoveChild(node);
                    }
                    Doc.Save(Application.StartupPath + "\\Data.xml");

                    // Disable txtOver
                    txtOver[p.X, p.Y].Enabled = false;
                }
            
          
        }
        private void txtLuongCB_TextChanged(object sender, EventArgs e)
        {
            // Cap nhat thong tin vao Salary.xml
            
            XmlDocument Doc = new XmlDocument();
            Doc.Load(Application.StartupPath + "\\Salary.xml");
            XmlNode node = Doc.SelectSingleNode("/Months/Month[date='" + thang + "/" + nam + "']");
            if (node != null)
            {
                node.ChildNodes[1].InnerText = txtLuongCB.Text; // sua nut luong CB
            }

            Doc.Save(Application.StartupPath + "\\Salary.xml");

            txtTongLuong.Text = (int.Parse(txtLuongCB.Text) + int.Parse(txtLuongTG.Text)).ToString();

        }
        private void txtLuongTG_TextChanged(object sender, EventArgs e)
        {
            // Cap nhat thong tin vao Salary.xml

            XmlDocument Doc = new XmlDocument();
            Doc.Load(Application.StartupPath + "\\Salary.xml");
            XmlNode node = Doc.SelectSingleNode("/Months/Month[date='" + thang + "/" + nam + "']");
            if (node != null)
            {
                node.ChildNodes[2].InnerText = txtLuongTG.Text; // sua nut luong TG
            }

            Doc.Save(Application.StartupPath + "\\Salary.xml");
            txtTongLuong.Text = (int.Parse(txtLuongCB.Text) + int.Parse(txtLuongTG.Text)).ToString();
        }
        private void txtOver_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
               //enter code here
                // Lay vi tri o text trong ma tran
                TextBox t = (TextBox)sender;
                Point p = GetPoint(t.Name);
                // Cong them tien luong them gio vao luong them gio
                if (txtOver[p.X, p.Y].Text.Trim() == "")
                {
                    txtLuongTG.Text = (int.Parse(txtLuongTG.Text) + (MoneyOfHour * 0)).ToString();
                }
                else
                {
                    txtLuongTG.Text = (int.Parse(txtLuongTG.Text) + (MoneyOfHour * int.Parse(txtOver[p.X, p.Y].Text))).ToString();
                }
                
                // Luu lai gia tri text trong data
                int ngay = int.Parse(check1[p.X, p.Y].Text);
                string date = ngay + "/" + thang + "/" + nam;
                XmlDocument Doc = new XmlDocument();
                Doc.Load(Application.StartupPath + "\\Data.xml");
                XmlNode node = Doc.SelectSingleNode("/Datas/Salary[date='" + date + "']");
                if (node != null)
                {
                    node.ChildNodes[1].InnerText = txtOver[p.X, p.Y].Text;
                }

                Doc.Save(Application.StartupPath + "\\Data.xml");

               // Sau do khoa truong text lai
                txtOver[p.X, p.Y].ReadOnly = true;

                // Luu lai thong tin them gio vao Data ---------------------------------------
            }
        }
        private void txtOver_DoubleClick(object sender, EventArgs e)
        {
            // Lay vi tri o text trong ma tran
            TextBox t = (TextBox)sender;
            Point p = GetPoint(t.Name);

            // Tru so tien tuong ung tai luong them gio
            if (txtOver[p.X, p.Y].Text.Trim() == "")
            {
                txtLuongTG.Text = (int.Parse(txtLuongTG.Text) - (MoneyOfHour * 0)).ToString();
                
            }
            else
            {
                txtLuongTG.Text = (int.Parse(txtLuongTG.Text) - (MoneyOfHour * int.Parse(txtOver[p.X, p.Y].Text))).ToString();
            }
            txtOver[p.X, p.Y].ReadOnly = false;
        }
        private void btnTraCuu_Click(object sender, EventArgs e)
        {
            frmTraCuu frm = new frmTraCuu();
            frm.Show();
        }

        #region Mot so function tien ich
        public Point GetPoint(string s)  // Lay ra vi tri x,y theo ten cua checkbox
        {
            Point p = new Point();
            p.X = int.Parse(s.Substring(10, 1));
            p.Y = int.Parse(s.Substring(11, 1));
            return p;
        }

        public bool IsDataExist(DateTime input)
        {
            string filename = Application.StartupPath + "\\Data.xml";
            DataTable dataTable = new DataTable();
            dataTable = XMLManager.ReadToXML(filename);
            DateTime dt = new DateTime();
            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
                dt = Convert.ToDateTime(dataTable.Rows[i]["date"].ToString());
                if (input == dt) return true;
            }
                return false;
        }

        #endregion

        private void Salary_KOG_FormClosing(object sender, FormClosingEventArgs e)
        {
            int ngay;
            // Duyet toan bo txtOver xem co o vao chua cap nhat du lieu -> nghia la o do thuoc tinh ReadOnly = true thi thong bao va khong cho dong form
            for (int i = 0; i < 6; i++)
            {
                for (int j = 0; j < 7; j++)
                {
                    // Khoi tao check1
                    if ((i == 0 && j >= thu) || i > 0)
                    {
                        ngay = ((i*7) + j + 1 - thu);
                        if (ngay > numday) break;

                        if (txtOver[i, j].ReadOnly == false)
                        {
                            MessageBox.Show("Có dữ liệu chưa được cập nhật");
                            e.Cancel = true;
                            return;
                        }

                    }
                    
                }
            }
                
        }
    }
}
